import os
from dotenv import load_dotenv, set_key
from pathlib import Path


class VariablesManager:
    """使用 dotenv 管理 API Token 的工具类，默认存储在 comm 文件夹"""

    def __init__(self, env_file: str = None):
        """
        初始化 Token 管理器

        参数:
            env_file: 环境变量文件路径，默认为 comm/.env_tokens
        """
        if env_file:
            self.env_file = env_file
            # 确保目录存在
            os.makedirs(os.path.dirname(self.env_file), exist_ok=True)
        else:
            # 默认使用项目根目录下的 comm 文件夹
            project_root = Path(__file__).parent.parent
            comm_dir = project_root / "comm"
            comm_dir.mkdir(exist_ok=True)  # 自动创建 comm 文件夹
            self.env_file = comm_dir / ".env"

        # 如果文件不存在，创建空的环境文件
        if not os.path.exists(self.env_file):
            Path(self.env_file).touch()
            print(f"已创建新的环境文件: {self.env_file}")

        # 加载环境变量
        load_dotenv(self.env_file)

    def save_var(self, token_name: str, token_value: str) -> None:
        """
        保存 Token 到环境文件

        参数:
            token_name: Token 变量名
            token_value: Token 值
        """
        # 更新环境变量文件
        set_key(self.env_file, token_name, token_value)
        # print(f"Token '{token_name}' 已保存到 {self.env_file}")

        # 更新当前环境
        os.environ[token_name] = token_value

    def get_var(self, token_name: str, default: str = None) -> str:
        """
        获取 Token 值

        参数:
            token_name: Token 变量名
            default: 默认值，若 Token 不存在则返回此值

        返回:
            Token 值或默认值
        """
        return os.getenv(token_name, default)

    def delete_vars(self, token_name: str) -> bool:
        """
        从环境文件中删除 Token

        参数:
            token_name: Token 变量名

        返回:
            是否成功删除
        """
        # 从当前环境中删除
        if token_name in os.environ:
            del os.environ[token_name]

        # 从文件中删除（通过注释掉该变量）
        if os.path.exists(self.env_file):
            with open(self.env_file, 'r') as f:
                lines = f.readlines()

            modified = False
            with open(self.env_file, 'w') as f:
                for line in lines:
                    if line.strip().startswith(f"{token_name}="):
                        f.write(f"# {line}")  # 注释掉原行
                        modified = True
                    else:
                        f.write(line)

            return modified

        return False

    def list_vars(self) -> dict:
        """
        列出环境文件中所有的 Token

        返回:
            包含所有 Token 的字典
        """
        tokens = {}
        if os.path.exists(self.env_file):
            with open(self.env_file, 'r') as f:
                for line in f:
                    line = line.strip()
                    if line and not line.startswith('#') and '=' in line:
                        key, value = line.split('=', 1)
                        tokens[key] = value
        return tokens


# 使用示例
# if __name__ == "__main__":

    # 示例 1: 使用默认存储位置 (comm/.env_tokens)
    # default_manager = VariablesManager()
    # default_manager.save_var("DEFAULT_TOKEN", "value_in_comm_folder")
    # print(f"默认位置 Token: {default_manager.get_var('DEFAULT_TOKEN')}")
    #
    # # 示例 2: 使用自定义存储位置
    # custom_path = Path.home() / ".my_app" / "secrets.env"
    # custom_manager = VariablesManager(env_file=str(custom_path))
    # custom_manager.save_var("CUSTOM_TOKEN", "custom_location_token")
    # print(f"自定义位置 Token: {custom_manager.get_var('CUSTOM_TOKEN')}")